package com.hake.core.support.service;

import java.util.List;
import java.util.Map;

import com.github.pagehelper.PageInfo;
import com.hake.core.exception.AppException;
import com.hake.core.exception.BusinessException;
import com.hake.core.exception.DataBaseException;

public interface IService<T, I> {
	
	/**
	 * <p>
	 * 插入一条记录
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return boolean
	 */
	boolean insert(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 插入一条记录（选择字段， null 字段不插入）
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return boolean
	 */
	boolean insertSelective(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 插入（批量），该方法不适合 Oracle
	 * </p>
	 * 
	 * @param entityList
	 *            实体对象列表
	 * @return boolean
	 */
	boolean insertBatch(List<T> entityList) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 ID 删除
	 * </p>
	 * 
	 * @param id
	 *            主键ID
	 * @return boolean
	 */
	boolean deleteById(I id) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 entity 条件，删除记录
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return boolean
	 */
	boolean deleteSelective(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 删除（根据ID 批量删除）
	 * </p>
	 * 
	 * @param idList
	 *            主键ID列表
	 * @return boolean
	 */
	boolean deleteBatchIds(List<I> idList) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 ID 修改
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return boolean
	 */
	boolean updateById(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 ID 选择修改
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return boolean
	 */
	boolean updateSelectiveById(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 whereEntity 条件，更新记录
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @param whereEntity
	 *            实体查询条件（可以为 null）
	 * @return boolean
	 */
	boolean update(T entity, T whereEntity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 whereEntity 条件，选择更新记录
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @param whereEntity
	 *            实体查询条件（可以为 null）
	 * @return boolean
	 */
	boolean updateSelective(T entity, T whereEntity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据ID 批量更新
	 * </p>
	 * 
	 * @param entityList
	 *            实体对象列表
	 * @return boolean
	 */
	boolean updateBatchById(List<T> entityList) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 ID 查询
	 * </p>
	 * 
	 * @param id
	 *            主键ID
	 * @return T
	 */
	T selectById(I id) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 查询（根据ID 批量查询）
	 * </p>
	 * 
	 * @param idList
	 *            主键ID列表
	 * @return List<T>
	 */
	List<T> selectBatchIds(List<I> idList) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 entity 条件，查询一条记录
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return T
	 */
	T selectOne(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 根据 entity 条件，查询总记录数
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @return int
	 */
	int selectCount(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 查询列表
	 * </p>
	 * 
	 * @param entity
	 *            实体对象
	 * @param orderByField
	 *            对应 EntityWrapper 类中 orderByField 字段
	 * @return
	 */
	List<T> selectList(T entity, String orderByField) throws DataBaseException, BusinessException, AppException ;

	List<T> selectList(T entity) throws DataBaseException, BusinessException, AppException ;

	/**
	 * <p>
	 * 翻页查询
	 * </p>
	 * 
	 * @param page
	 *            翻页对象
	 * @param entity
	 *            实体对象
	 * @param orderByField
	 *            对应 EntityWrapper 类中 orderByField 字段 
	 * @return
	 */
	PageInfo<T> selectPage(T entity, String orderByField) throws DataBaseException, BusinessException, AppException ;
	
	PageInfo<T> selectPage(T entity) throws DataBaseException, BusinessException, AppException ;

	PageInfo<T> selectPage(Map<String, Object> params) throws DataBaseException, BusinessException, AppException ;
}
